package com.itheima.project.service;

import com.itheima.project.exception.ProjectException;
import com.itheima.project.vo.search.SearchPageVo;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.util.List;
import java.util.Map;

/**
 * es中文档的操作方法
 */
public interface DocumentService {
    /**
     * 保存对象到索引库
     * @param doc  根据class中的EsIndex注解 判断索引库名称
     * @param <T>
     * @throws ProjectException
     */
    <T> void save(T doc) throws ProjectException;
    /**
     * 保存对象到索引库
     * @param doc  指定索引库名称
     * @param indexName
     * @param <T>
     * @throws ProjectException
     */
    void save(Map doc, String indexName) throws ProjectException;
    /**
     * 批量保存数据到所辛苦
     * @param list  要保存的数据集合
     * @param indexName  索引库名称
     * @throws ProjectException
     */
    void saveBatch(List<Map> list,String indexName) throws ProjectException;
    /**
     * 根据ID删除索引库数据
     * @param id
     */
    void deleteById(Object id,String indexName);
    /**
     * 根据ID获取索引库数据
     * @param id
     * @param tClass
     * @param <T>
     * @return
     */
    <T> T getById(Object id,Class<T> tClass);
    Object getById(Object id,String indexName);
    /**
     * 搜索数据
     * @param sourceBuilder 原生条件
     * @param tClass 根据esIndex注解，判断索引库
     * @return 原生返回结果
     */
    SearchResponse search(SearchSourceBuilder sourceBuilder, Class<?> tClass);
    /**
     * 搜索数据
     * @param sourceBuilder 原生条件
     * @param indexName  根据指定索引库名称
     * @return 原生返回结果
     */
    SearchResponse search(SearchSourceBuilder sourceBuilder, String indexName);
    /**
     * @param sourceBuilder 搜索条件
     * @param <T>
     * @return
     */
    <T> SearchPageVo<T> page(SearchSourceBuilder sourceBuilder, Class<T> tClass);
}
